/*
 * libSockets.h
 *
 *  Created on: 27/02/2012
 *      Author: utnso
 */

#ifndef LIBSOCKETS_H_
#define LIBSOCKETS_H_

//INCLUDES

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#include "libPaquetes.h"
#include "libThreads.h"

//CONSTANTES

//#define MAX_BUFFER_SOCKETS 1000
//#define MAX_PAYLOAD_LENGTH 200

//TIPOS

typedef struct t_conexion{
	int32_t descriptor;
	int8_t enUso;//-1 No inicializado/0 No en uso/1 En uso.
} __attribute__((packed)) t_conexion;

typedef struct t_infoAtenderCliente{
	int32_t descriptor;
	void (*procPed)(char*, char**, uint16_t*);
} __attribute__((packed)) t_infoAtenderCliente;

//FUNCIONES

void inicializarDatosSockets(char*, int32_t, uint8_t);

void inicializarPoolConexiones(void);
/*Este proceso inicializa el pool de conexiones.
 */

void finalizarDatosSockets(void);

void finalizarPoolConexiones(void);

void obtenerConexion(int32_t*);
/*Este proceso obtiene una conexion. Busca en el pool de
 * conexiones alguna en desuso, o si encuentra una que no haya
 * sido inicializada, la inicializa.
 * ------------------------------------------------------------
 * Recibe un puntero vacio a un descriptor donde guardara el obtenido.
 */

void habilitarConexion(int32_t);
/*Este proceso marca una conexion del pool de conexiones como
 * en desuso para que pueda ser usada por otros procesos.
 * ------------------------------------------------------------
 * Recibe un descriptor.
 */

void cerrarConexion(int32_t);
/*Este proceso cierra una conexion del pool de conexiones y
 * la marca como no inicializada.
 * ------------------------------------------------------------
 * Recibe un descriptor.
 */

void cerrarConexiones();

int32_t enviar(int32_t, paquete_t);

int32_t recibir(int32_t, paquete_t*);

uint8_t unPedidoUnRecibo(char*, char**);
/*Esta funcion realiza un pedido por sockets y espera una
 * respuesta.
 * ------------------------------------------------------------
 * Recibe una cadena conteniendo el pedido y un buffer donde
 * guardar el recibo.
 * ------------------------------------------------------------
 * Devuelve:
 *      0 si el envio y el recibimiento fueron exitosos.
 *      1 si el recibimiento fallo.
 *      2 si el envio fallo.
 */

uint8_t hacerHandShake(int32_t);

void servidor(void (*procPed)(char*, char**, uint16_t*));
/*Este proceso hace de servidor, poniendose a la escucha y creando
 * un thread por cada conexion establecida.
 * ------------------------------------------------------------
 * Recibe un puntero a un indicador de termino del programa y
 * su corresepondiente semaforo.
 */

void atenderCliente(void*);
/*Este proceso se encarga de atender los pedidos de un cliente y
 * enviar una respuesta.
 * ------------------------------------------------------------
 * Recibe un puntero que debe contener la estructura
 * t_infoAtenderCliente casteada a void*.
 */

#endif /* LIBSOCKETS_H_ */
